package cc.opcol.iot.server.sdk;

import cc.opcol.iot.server.domain.JsEventHandle;
import cc.opcol.iot.server.server.IoTSession;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.script.ScriptEngine;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Component
public class JSTimerManager {
    static Logger logger= LoggerFactory.getLogger(JSTimerManager.class);
    private Map<String, List<JsTimer>> timerMaps = new ConcurrentHashMap<>();

    public JsTimer createTimer(IoTSession session, String timerId, String callFunction, ScriptEngine scriptEngine){
        if(session==null || StringUtils.isBlank(session.getId())){
            return null;
        }
        if(timerId==null || StringUtils.isBlank(timerId)){
            return null;
        }
        JsTimer jsTimer=new JsTimer(timerId);
        jsTimer.setTask(new JsTimerTask(callFunction,scriptEngine,session));
        JsEventHandle jsEventHandle= (JsEventHandle) scriptEngine.get("script_object");
        if(jsEventHandle!=null){
            jsTimer.setJsID(jsEventHandle.get_id());
        }
        List<JsTimer> jsTimers=timerMaps.get(session.getId());
        if(jsTimers==null){
            jsTimers=new ArrayList<>();
            timerMaps.put(session.getId(),jsTimers);
        }
        jsTimers.add(jsTimer);
        return jsTimer;
    }

    public List<Long> listJsID(){
        Map<Long,Long> idMaps=new HashMap<>();
        for(String key:timerMaps.keySet()){
            List<JsTimer> jsTimers=timerMaps.get(key);
            for(JsTimer jsTimer:jsTimers){
                idMaps.put(jsTimer.getJsID(),jsTimer.getJsID());
            }
        }
        List<Long> idList=new ArrayList<>();
        for(Long id:idMaps.keySet()){
            idList.add(id);
        }
        return idList;
    }


    public void cancelTimer(String sessionId,String timerId){
        if(sessionId==null || StringUtils.isBlank(sessionId)){
            return ;
        }
        if(timerId==null || StringUtils.isBlank(timerId)){
            return ;
        }
        List<JsTimer> jsTimers=timerMaps.get(sessionId);
        if(jsTimers==null){
            return;
        }
        for(JsTimer jsTimer : jsTimers){
            if(jsTimer.equals(timerId)){
                jsTimer.cancel();
                jsTimers.remove(jsTimer);
                break;
            }
        }
    }

    public void cancelTimer(String sessionId) {
        logger.debug("Cancel timer by session["+sessionId+"]");
        if(sessionId==null || StringUtils.isBlank(sessionId)){
            return ;
        }
        List<JsTimer> jsTimers=timerMaps.get(sessionId);
        if(jsTimers==null){
            return;
        }
        for(JsTimer jsTimer:jsTimers){
            jsTimer.cancel();
        }
        jsTimers.clear();
    }

    public void cancelTimerByJSID(Long jsId) {
        for(String key:timerMaps.keySet()){
            List<JsTimer> jsTimers=timerMaps.get(key);
            for(int i=jsTimers.size()-1;i>=0;i--){
                JsTimer jsTimer=jsTimers.get(i);
                if(jsTimer.getJsID()==jsId){
                    jsTimer.cancel();
                }
                jsTimers.remove(jsTimer);
            }
        }
    }
}
